Оператор scan
Оператор scan
в RxJS используется для последовательного преобразования значений последовательности (Observable) на основе некоторой аккумулирующей функции и начального значения. Он похож на оператор reduce
в JavaScript, но в отличие от reduce
, scan
испускает каждое промежуточное значение в процессе сканирования.
Давайте рассмотрим шаги и примеры кода для лучшего понимания оператора scan
:
Шаг 1: Импорт оператора scan
и необходимых функций из библиотеки RxJS:
import { scan } from 'rxjs/operators';
import { of } from 'rxjs';
Шаг 2: Создание Observable последовательности, для которой мы хотим использовать оператор scan
:
const source$ = of(1, 2, 3, 4, 5);
Шаг 3: Использование оператора scan
для преобразования значений последовательности:
const result$ = source$.pipe(
scan((acc, curr) => acc + curr, 0)
);
Шаг 4: Подписка на результирующую последовательность и обработка ее значений:
result$.subscribe(value => console.log(value));
В результате выполнения этого кода мы получим следующий вывод:
1
3
6
10
15
Объяснение: Оператор scan
последовательно применяет аккумулирующую функцию к значениям последовательности, сохраняя промежуточные результаты. В нашем примере, аккумулирующая функция (acc, curr) => acc + curr
складывает текущее значение curr
со значением аккумулятора acc
. Начальное значение аккумулятора устанавливается равным 0. Каждый раз, когда поступает новое значение, оператор scan
испускает текущий результат сканирования.
Таким образом, наша последовательность [1, 2, 3, 4, 5] преобразуется в последовательность промежуточных значений [1, 3, 6, 10, 15], которые выводятся в консоль.